/*!
 * @file log.hh
 * @brief Zbieranie informacji do loga
 */

#ifndef __ENGINE_LOG_HH
#define __ENGINE_LOG_HH

#include <string>
#include <sstream>
#include <fstream>
#include "engine/pawirr.hh"
#include "engine/cmd.hh"

/*!
 * @brief Typy komunikatów w funkcji log_add()
 * LOG_INFO - zwykła, nieistotna informacja
 * LOG_WARNING - błędy w plikach wczytywanych. Kod będzie działał poprawnie
 * LOG_ERROR - błędy działania kodu, program może się kontynuować
 * LOG_CRASH - program wymaga natychmiastowego przerwania
 */
enum _log_msg_type {
	LOG_INFO, LOG_WARNING, LOG_ERROR, LOG_CRASH
};

class log{
public:

	/*!
	 * @brief Dodanie informacji [bez wpływu na program]
	 * @param msg Informacja
	 */
	static void info(std::string msg);

	/*!
	 * @brief Dodanie ostrzeżenia [bez wpływu na program]
	 * @param msg Ostrzeżenie
	 */
	static void warning(std::string msg);

	/*!
	 * @brief Dodanie komunikatu o błędzie [bez wpływu na program]
	 * @param msg Bład
	 */
	static void error(std::string msg);

	/*!
	 * @brief Dodanie komunikatu o crashu [ubicie programu]
	 * @param msg Błąd krytyczny
	 */
	static void crash(std::string msg);

private:

	/*!
	 * @brief Konstruktor uniemożliwiający tworzenie obiektów
	 * @return
	 */
	log();

	/*!
	 * @brief Plik do zapisu
	 */
	static std::ofstream logStream;

	/*!
	 * @brief Logowanie zdarzeń do pliku
	 * @param str komunikat do zapisania
	 * @param msgType typ komunikatu
	 */
	static void add(std::string str, _log_msg_type msgType);
};

#else
class log;
#endif
